package bomberman.modelo.obstaculos;

import org.jdom2.Element;

import bomberman.modelo.IContenible;
import bomberman.modelo.IDaniable;
import bomberman.modelo.armas.OndaExpansiva;
import bomberman.modelo.personajes.Personaje;
import bomberman.modelo.items.Item;
import bomberman.modelo.mapa.Casillero;
import bomberman.modelo.observadores.Observadores;
import fiuba.algo3.titiritero.modelo.ObjetoPosicionable;

public abstract class Obstaculo implements IDaniable, IContenible,
    ObjetoPosicionable {
  private Casillero ubicacion;
  private int       resistencia;
  
  public Obstaculo(Casillero unaUbicacion, int unaResistencia) {
    this.ubicacion = unaUbicacion;
    this.resistencia = unaResistencia;
    this.ubicacion.setContenidoBajo(this);
    Observadores.notificar(this);
  }
  
  public int getResistencia() {
    return this.resistencia;
  }
  
  public Casillero getUbicacion() {
    return this.ubicacion;
  }
  
  @Override
  public void daniarCon(OndaExpansiva unaOndaExpansiva) {
    int destruccion = unaOndaExpansiva.getDestruccion();
    if (this.resistencia > destruccion) {
      this.resistencia -= destruccion;
      Observadores.notificar(this);
    } else {
      this.resistencia = 0;
      Observadores.notificar(this);
      this.destruir();
      Item.generarContenidoRandom(this.ubicacion);
      this.ubicacion = null;
    }
  }
  
  @Override
  public boolean esCaminablePor(Personaje unPersonaje) {
    return false;
  }
  
  @Override
  public boolean esSobrevolable() {
    return true;
  }
  
  @Override
  public boolean esBalisticamentePermeable() {
    return false;
  }
  
  private void destruir() {
    this.ubicacion.setContenidoBajo(null);
  }
  
  @Override
  public int getX() {
    return (this.ubicacion.getPosicion().getHorizontal());
  }
  
  @Override
  public int getY() {
    return (this.ubicacion.getPosicion().getVertical());
  };
    
  protected Element serializar(Element elemObstaculo){
	  elemObstaculo.setAttribute("Resistencia", String.valueOf(resistencia));
	  elemObstaculo.setContent(this.getUbicacion().serializarUbicacion());
	  return elemObstaculo;
  }
  
}
